import importlib


class Config(dict):
    '''
    用法:
        首先from wxmbot.config imort config
        然后导入配置文件，目前只支持 a.b.c(包的方式)
        比如 config/env.py 的内容为:
            a = 1
            _b = 2 # 开头带_的不识别
        config.load_config('config.env') # 导入配置

        下边是对配置的使用:
            print(config.a) # 1
            print(config['a']) # 1
            print(config.b) # None
            print(config['b']) # 会引发 KeyError 异常, 建议使用下边方法
            print(config.get('b', 2)) # 2
            print(config.setting_env.a) # 1
            print(config.setting_env.b) # 会引发 AttributeError 异常, # setting_env就是setting_和模块名, 它也是这模块, 可以使用getattr(config.setting_env, 'b', 'default')
            print(getattr(config.setting_env, 'b', 'default')) # default
        总之, 在获取变量上, 有三种方法:
            1. 对象的属性，有则为实际，无则为None
            2. 把config当成字典, 有则为实际，无则报异常，可用config.get(key, default)方式获取
            3. config.setting_模块名 就是你引入的那个配置名, 直接按照模块使用属性的方式来使用就可以了
        注意: 不区分大小写(全小写或配置中的配置是相同的)
    '''
    # 以下是默认内置配置
    pretty_msg = True # 是否对来的新消息美化打印
    print_send_out_msg = False # 是否打印来自send_out_msg的信息(自己发的信息都会有这个事件)
    print_json_msg = False # 是否打印消息中的json_msg(一般不需要查看, 默认不)

    def __init__(self, root_path='.', defaults=None):
        dict.__init__(self, defaults or {})
        self.root_path = root_path

    def load_config(self, module_name):
        module = importlib.import_module(module_name)
        for key in dir(module): # dir() 获得当前模块的属性列表
            if key[0] != '_':
                self[key] = getattr(module, key)
                self[key.lower()] = getattr(module, key)
        self[f"setting_{module_name.split('.')[-1]}".lower()] = module

    def __getattr__(self, key):
        return getattr(Config, key, self.get(key))


config = Config()
